from typing import *
from buffer_types import *


# upymod/modtrezorconfig/modtrezorconfig.c
def init(
   ui_wait_callback: Callable[[int, int, StorageMessage], bool] | None =
   None
) -> None:
    """
    Performs a soft re-initialization of the storage.
    Locks the storage if it is currently unlocked, and allows setting
    a new UI callback.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def unlock(pin: str, ext_salt: AnyBytes | None) -> bool:
    """
    Attempts to unlock the storage with the given PIN and external salt.
    Returns True on success, False on failure.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def check_pin(pin: str, ext_salt: AnyBytes | None) -> bool:
    """
    Check the given PIN with the given external salt.
    Returns True on success, False on failure.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def lock() -> None:
    """
    Locks the storage.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def is_unlocked() -> bool:
    """
    Returns True if storage is unlocked, False otherwise.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def has_pin() -> bool:
    """
    Returns True if storage has a configured PIN, False otherwise.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def get_pin_rem() -> int:
    """
    Returns the number of remaining PIN entry attempts.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def change_pin(
    oldpin: str,
    newpin: str,
    old_ext_salt: AnyBytes | None,
    new_ext_salt: AnyBytes | None,
) -> bool:
    """
    Change PIN and external salt. Returns True on success, False on failure.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def ensure_not_wipe_code(pin: str) -> None:
    """
    Wipes the device if the entered PIN is the wipe code.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def has_wipe_code() -> bool:
    """
    Returns True if storage has a configured wipe code, False otherwise.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def change_wipe_code(
    pin: str,
    ext_salt: AnyBytes | None,
    wipe_code: str,
) -> bool:
    """
    Change wipe code. Returns True on success, False on failure.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def get(app: int, key: int, public: bool = False) -> bytes | None:
    """
    Gets the value of the given key for the given app (or None if not set).
    Raises a RuntimeError if decryption or authentication of the stored
    value fails.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def set(app: int, key: int, value: AnyBytes, public: bool = False) -> None:
    """
    Sets a value of given key for given app.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def delete(
    app: int, key: int, public: bool = False, writable_locked: bool = False
) -> bool:
    """
    Deletes the given key of the given app.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def set_counter(
    app: int, key: int, count: int, writable_locked: bool = False
) -> None:
    """
    Sets the given key of the given app as a counter with the given value.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def next_counter(
   app: int, key: int, writable_locked: bool = False,
) -> int:
    """
    Increments the counter stored under the given key of the given app and
    returns the new value.
    """


# upymod/modtrezorconfig/modtrezorconfig.c
def wipe() -> None:
    """
    Erases the whole config. Use with caution!
    """
from enum import IntEnum


# upymod/modtrezorconfig/modtrezorconfig.c
class StorageMessage(IntEnum):
    NO_MSG = 0
    VERIFYING_PIN_MSG = 1
    PROCESSING_MSG = 2
    STARTING_MSG = 3
    WRONG_PIN_MSG = 4
